home *** CD-ROM | disk | FTP | other *** search
- PROGRAM Serial (Input, Output);
- USES CRT;
-
- CONST
- HexDigits : ARRAY [0..15]OF CHAR = '0123456789ABCDEF';
- TYPE
- InfoBuffer = RECORD
- InfoLevel : WORD; {should be zero}
- Serial : LONGINT;
- VolLabel : ARRAY [0..10]OF CHAR;
- FileSystem : ARRAY [0..7]OF CHAR;
- END;
- SerString = STRING [9];
-
- VAR
- IB : InfoBuffer;
- N : WORD;
- let : CHAR;
- param : STRING [10];
- IsSet : BOOLEAN;
- NewSerial : LONGINT;
- code : INTEGER;
-
- FUNCTION SerialStr (L : LONGINT) : SerString;
- VAR Temp : SerString;
- BEGIN
- Temp [0] := #9;
- Temp [1] := HexDigits [L SHR 28];
- Temp [2] := HexDigits [ (L SHR 24) AND $F];
- Temp [3] := HexDigits [ (L SHR 20) AND $F];
- Temp [4] := HexDigits [ (L SHR 16) AND $F];
- Temp [5] := '-';
- Temp [6] := HexDigits [ (L SHR 12) AND $F];
- Temp [7] := HexDigits [ (L SHR 8) AND $F];
- Temp [8] := HexDigits [ (L SHR 4) AND $F];
- Temp [9] := HexDigits [L AND $F];
- SerialStr := Temp;
- END;
-
- FUNCTION GetSerial (DiskNum : BYTE;
- VAR I : InfoBuffer) : WORD;assembler;
- asm
- MOV AH, 69h
- MOV AL, 00h
- MOV BL, DiskNum
- PUSH DS
- LDS DX, I
- INT 21h
- POP DS
- JC @Bad
- XOR AX, AX
- @Bad :
- END;
-
- FUNCTION SetSerial (DiskNum : BYTE;
- VAR I : InfoBuffer) : WORD;assembler;
- asm
- MOV AH, 69h
- MOV AL, 00h
- MOV BL, DiskNum
- PUSH DS
- LDS DX, I
- INT 21h
- POP DS
- JC @Bad
- XOR AX, AX
- @Bad :
- END;
-
- PROCEDURE ErrorOut (err : BYTE);
- BEGIN
- CASE err OF
- 5 : BEGIN
- WRITELN ('Either the disk in ', let, ': is write',
- 'protected or it lacks an extended BPB.');
- WRITELN ('If the disk is not write-protected, ',
- 'reformat it with DOS 4 or higher.');
- END;
- 15 : WRITELN ('Not a valid drive letter.');
- 255 : BEGIN
- WRITELN ('SYNTAX: SERIAL D:########"');
- WRITELN (' where D: is the drive letter',
- 'and ######## is the eight digit');
- WRITELN (' hexadecimal serial number with-',
- 'out the "-".');
- WRITELN ('EXAMPLE: SERIAL A: 1234ABCD');
- END;
-
- ELSE WRITELN ('DOS ERROR #', N);
- END;
- HALT (1);
- END;
-
- BEGIN
- CLRSCR;
- IF PARAMCOUNT < 1 THEN ErrorOut (255);
- IF PARAMCOUNT > 2 THEN ErrorOut (255);
- param := PARAMSTR (1);
- CASE LENGTH (param) OF
- 1 : {OK};
- 2 : IF param [2] <> ':' THEN ErrorOut (255);
- ELSE ErrorOut (255);
- END;
- let := UPCASE (param [1]);
- IF (let < 'A') OR (let > 'Z') THEN ErrorOut (15);
- IF PARAMCOUNT < 2 THEN IsSet := FALSE
- ELSE
- BEGIN
- IsSet := TRUE;
- param := '$' + PARAMSTR (2);
- VAL (param, NewSerial, code);
- IF code <> 0 THEN ErrorOut (255);
- END;
- N := GetSerial (ORD (let) - ORD ('@'), IB);
- IF N = 0 THEN
- BEGIN
- WITH IB DO
- BEGIN
- WRITELN ('Serial Number is "',
- SerialStr (Serial), '"');
- IF IsSet THEN
- BEGIN
- Serial :=
- NewSerial; ;
- N :=
- SetSerial (ORD (let) - ORD ('@'), IB);
- IF N = 0 THEN
-
- WRITELN ('Successfully canged serial to "', SerialStr (NewSerial), '"')
- ELSE
- ErrorOut (N);
- END;
- END;
- END
- ELSE ErrorOut (N);
-
- END.
-